// Package jwt
// @File: jwt.go
// @Description: jwt
// @Author: YaoRuiQi
// @Date: 2025/8/23 02:53

package jwt

import (
	"errors"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

type jwtManager struct {
	secretKey []byte
}

var JWTManager *jwtManager

// Init
//
//	@Description: 初始化JWTManager
//	@param secretKey 密钥
func Init(secretKey []byte) {
	JWTManager = &jwtManager{
		secretKey: secretKey,
	}
}

// GenerateJWT
//
//	@Description: 生成用户JWT
//	@param userId 用户ID
//	@param role 用户角色
//	@param isDisable 是否禁用 0-否 1-是
//	@param expirHour 过期时间（小时）
//	@return string 生成的token
//	@return int64 过期时间戳
func (j jwtManager) GenerateJWT(userId int64, role string, isDisable int32, expirHour int) (string, int64, error) {
	claims := &UserClaims{
		UserID:    userId,
		UserRole:  role,
		IsDisable: isDisable,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * time.Duration(expirHour))),
		},
	}

	// 创建 token
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err := token.SignedString(j.secretKey)
	if err != nil {
		return "", 0, err
	}

	return tokenString, claims.RegisteredClaims.ExpiresAt.Unix(), nil
}

// ParseJWT
//
//	@Description: 解析JWT
//	@param tokenString JWT字符串
//	@return *UserClaims 解析后的用户信息
func (j jwtManager) ParseJWT(tokenString string) (*UserClaims, error) {
	token, err := jwt.ParseWithClaims(
		tokenString,
		&UserClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return j.secretKey, nil
		},
	)

	if err != nil {
		return nil, err
	}
	if claims, ok := token.Claims.(*UserClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, errors.New("无效的token")
	}
}
